// function mySymbol(obj) {
//   let unique = (Math.random() + new Date().getTime()).toString(32).slice(0, 8)
//   if (obj.hasOwnProperty(unique)) {
//       return mySymbol(obj) //递归调用
//   } else {
//       return unique
//   }
// }

Function.prototype.myApply = function(context, arg) {
  if (typeof this !== "function") {
    throw new TypeError("not a function")
  }
  // 如果没有传或传的值为空对象 context指向window
  context = context || window
  // 防止覆盖已有属性
  let fn = Symbol('fn')
  context[fn] = this //给context添加一个方法 指向this
  let result = context[fn](...arg) //执行fn
  delete context[fn] //删除方法
  return result
}

// 测试
var obj = { name: 123 }
function foo(...args) {
  console.log(this.name, args)
}
var s = foo.myApply(obj, ['111', '222'])
